package org.example.myjavaweb_de.servlet;

import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.json.JSONObject;

import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/ce1")
public class ceshi1 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 设置允许跨域的头部信息
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type");
        response.setHeader("Access-Control-Max-Age", "3600");
        // 设置响应内容类型为 JSON
        response.setContentType("application/json;charset=UTF-8");
        // 创建 JSON 数据
        JSONObject as= new JSONObject();
        as.put("message", "Hello from Servlet (JSON)");
        as.put("id","5");
        as.put("cs",new JSONObject().put("aq",'6').put("qr",'8'));
//前面是键，后面是值，向 JSON 对象中添加一个键为 "message"、值为 "Hello from Servlet (JSON)" 的字段。

        // 将 JSON 数据写入响应
        // PrintWriter out = response.getWriter(); 是 Java Web 开发中（如 Servlet）常用的代码，
        // 其作用是从 HTTP 响应对象（HttpServletResponse）中获取一个字符输出流（PrintWriter），
        // 用于向客户端（如浏览器）返回文本格式的响应数据（如 HTML、XML、JSON 等）
        // 在获取 PrintWriter 之前，需通过 response.setContentType() 指定响应的内容类型（MIME 类型）和字符编码。
        PrintWriter out = response.getWriter();
        //将变量 jsonResponse 的内容写入输出流（如 PrintWriter 或 OutputStream
        out.print(as.toString());
        //toString() 会生成标准 JSON 字符串。将 jsonResponse 对象序列化为 JSON 格式的字符串。

        //强制清空输出流的缓冲区，确保数据立即发送。
        //out 是输出流对象（例如在Servlet中通过 response.getWriter() 获取）。
        //print() 方法将数据写入缓冲区，但不会立即发送到目的地（如客户端浏览器或文件）。
        out.flush();
        //调用 flush() 会立即将缓冲区的数据推送到目的地，适用于需要实时性的场景（如长轮询、分块传输）。
        //默认情况下，输出流可能缓冲数据以提高效率（积累一定量再发送）。
        //在Web开发中，这可能让客户端提前接收部分响应。
    }
}
